home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
MPW_TOOL
/
TOOLS
/
TOOLS_WI
/
BYACC__
/
PRINT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-19
|
4KB
|
227 lines
#include <stdio.h>
#include "action.h"
#include "defs.h"
#include "dep.h"
#include "new.h"
#include "files.h"
#include "gram.h"
#include "state.h"
verbose()
{
register int i;
putc(FF,verbose_file);
putc(NEWLINE, verbose_file);
if (SRtotal + RRtotal > 0)
log_conflicts();
for (i = 0; i < nstates; i++)
print_state(i);
}
log_conflicts()
{
register int i;
for (i = 0; i < nstates; i++)
{
if (SRconflicts[i] || RRconflicts[i])
{
fprintf(verbose_file, "State %3d contains ", i);
if (SRconflicts[i] == 1)
fprintf(verbose_file, "1 shift/reduce conflict");
else if (SRconflicts[i] > 1)
fprintf(verbose_file, "%d shift/reduce conflicts", SRconflicts[i]);
if (SRconflicts[i] && RRconflicts[i])
fprintf(verbose_file, " and ");
if (RRconflicts[i] == 1)
fprintf(verbose_file, "1 reduce/reduce conflict");
else if (RRconflicts[i] > 1)
fprintf(verbose_file, "%d reduce/reduce conflicts", RRconflicts[i]);
fprintf(verbose_file, ".\n");
}
}
fprintf(verbose_file, "\n\n");
}
print_state(state)
int state;
{
fprintf(verbose_file, "\n\nstate %3d\n", state);
if (state < final_state)
{
print_core(state);
print_actions(state);
}
else
fprintf(verbose_file, "\n accept\n");
}
print_core(state)
int state;
{
register int i;
register int k;
register int rule;
register core *statep;
register short *sp;
register short *sp1;
statep = state_table[state];
k = statep->nitems;
if (k == 0) return;
putc('\n', verbose_file);
for (i = 0; i < k; i++)
{
sp1 = sp = ritem + statep->items[i];
while (*sp > 0)
sp++;
rule = -(*sp);
fprintf(verbose_file, " %s -> ", symbol_name[rlhs[rule]]);
for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
{
fprintf(verbose_file, "%s ", symbol_name[*sp]);
}
putc('.', verbose_file);
while (*sp > 0)
{
fprintf(verbose_file, " %s", symbol_name[*sp]);
sp++;
}
putc('\n', verbose_file);
}
}
print_actions(stateno)
int stateno;
{
register action *p;
register shifts *sp;
register int i, as;
p = parser[stateno];
if (p)
{
print_shifts(p);
print_reductions(p, defred[stateno]);
}
sp = shift_table[stateno];
if (sp && sp->nshifts > 0)
{
as = accessing_symbol[sp->shifts[sp->nshifts - 1]];
if (ISVAR(as))
print_gotos(stateno);
}
}
print_shifts(p)
register action *p;
{
register int count;
register action *q;
count = 0;
for (q = p; q; q = q->next)
{
if (q->suppressed < 2 && q->action_code == SHIFT)
count++;
}
if (count > 0)
{
putc(NEWLINE, verbose_file);
for (; p; p = p->next)
{
if (p->action_code == SHIFT)
{
if (p->suppressed == 0)
{
fprintf(verbose_file, " shift %3d %s\n", p->number,
symbol_name[p->symbol]);
}
else if (p->suppressed == 1)
{
fprintf(verbose_file, " <shift %3d %s>\n", p->number,
symbol_name[p->symbol]);
}
}
}
}
}
print_reductions(p, defred)
register action *p;
register int defred;
{
register int k, anyreds;
register action *q;
anyreds = 0;
for (q = p; q ; q = q->next)
{
if (q->action_code == REDUCE && q->suppressed < 2)
{
anyreds = 1;
break;
}
}
if (anyreds)
{
putc(NEWLINE, verbose_file);
for (; p; p = p->next)
{
if (p->action_code == REDUCE && p->number != defred)
{
k = p->number;
if (p->suppressed == 1)
fprintf(verbose_file, " <reduce %3d %s>\n",
k, symbol_name[p->symbol]);
else if (p->suppressed == 0)
fprintf(verbose_file, " reduce %3d %s\n",
k, symbol_name[p->symbol]);
}
}
if (defred >= 0)
fprintf(verbose_file, " reduce %3d $default\n", defred);
}
}
print_gotos(stateno)
int stateno;
{
register int i, k;
register int as;
register short *to_state;
register shifts *sp;
putc(NEWLINE, verbose_file);
sp = shift_table[stateno];
to_state = sp->shifts;
for (i = sp->nshifts - 1; i >= 0; i--)
{
k = to_state[i];
as = accessing_symbol[k];
if (ISVAR(as))
fprintf(verbose_file, " goto %3d %s\n", k, symbol_name[as]);
else
break;
}
}